package com.hfb.mashibing.alip8.threadpool;

import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class MyThreadPoolExecutor02 {
    public static void main(String[] args) {
        // 自定义线程池！ 工作 ThreadPoolExecutor
        /**
        * 最大线程到底该如何定义:
        * 1、CPU 密集型 几核，就定义为几，可以保证CPU效率最高！
        * 2、IO  密集型  判断你的程序中十分耗IO的线程
        *    程序  15个大型任务  io十分占用资源！
        */
        //获取CPU的核数
        int CPUx = Runtime.getRuntime().availableProcessors();
        System.out.println(CPUx);
        ThreadPoolExecutor threadPool = new ThreadPoolExecutor(2,
            CPUx,
             3,
             TimeUnit.SECONDS,
             new LinkedBlockingDeque<>(3), // 候客区
             Executors.defaultThreadFactory(), // 默认线程工厂
             new ThreadPoolExecutor.AbortPolicy() // 默认的拒绝策略，银行满了还有人进来，不处理，抛出异常
        //            new ThreadPoolExecutor.CallerRunsPolicy() // 拒绝策略，哪来的去哪里
        //            new ThreadPoolExecutor.DiscardPolicy()  // 拒绝策略, 队列满了不会抛出异常
        //            new ThreadPoolExecutor.DiscardOldestPolicy()  // 拒绝策略，队列满了，尝试去和最早的竞争，不会抛出异常
        );

        try {
            // 最大承载：Queue + max
            // 超过最大承载抛出异常：RejectedExecutionException
            for (int i = 1; i <= 9; i++) {
                //线程池创建线程
                //threadPool.execute(参数为Runnable)
                threadPool.execute(() -> {
                    System.out.println(Thread.currentThread()
                                        .getName() + "--->ok");
                });
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 线程池用完，程序结束，关闭线程
            threadPool.shutdown();
        }

    }
}
